/*
 面向对象：
 在编程过程中，所有操作通过对象来进行

 对象：object，每一个对象都可以代表一个具体的事物

 类：对象的模型
 包含属性和方法

 实例属性
 直接定义的
 类属性，在属性前加上static关键字
 class Person {
    // 定义实例属性
    name:string = "小凯"
    // 在属性前加上static关键字可以定义一个类属性,又称静态属性
    static age:number = 19
 }
 readonly 关键字 表示只读的属性，不能进行修改

 实例方法：
 方法名() {}
 
 类方法：
 static 方法名() {}

 say() {
    console.log("说话")
 }
 static eat() {
    console.log("吃饭")
 }

 构造函数
 constructor

 抽象类
 abstract，只能用于继承，不能用来创建实例
 抽象类中可以添加抽象方法
 抽象方法：定义结构，在子类中重写

 接口：用来定义一个类的结构，可以限制一个类的结构
 接口中的属性都不能有实际的值

 封装
 属性修饰符
 public 可以在任意位置修改
 private 只能在类内部被修改

*/

(function (){
    //定义一个接口
    interface myInterface{
        name:string
        age:number
        say():void
    }
    // 实现一个接口
    class MycClass implements myInterface{
        age: number;
        name: string;
        constructor(name:string,age:number) {
            this.name = name
            this.age = age
        }

        say(): void {
            console.log("接口")
        }
    }
    abstract class Animal {
        name:string
        age:number
        constructor(name:string,age:number) {
            this.name = name
            this.age = age
        }
        say(sayWord:string) {
            console.log(sayWord)
        }
        //抽象方法
        abstract eat():void;
    }
    
    class Dog extends Animal{
        say(sayWord: string) {
            super.say(sayWord);
        }
        eat() {
            console.log("狗粮")
        }
    }

    class Cat extends Animal{
        sayWord = "喵喵喵"
        say() {
            super.say(this.sayWord);
        }
        eat() {
            console.log("猫粮")
        }
    }

    const dog = new Dog("旺财",5)
    dog.say("汪汪汪")
    const cat = new Cat("咪咪",3)
    cat.say()

    class Person {
       private _name:string
        age:number
        constructor(name:string,age:number) {
            this._name = name
            this.age = age
        }
        get name() {
           return this._name
        }
        set name(val:string) {
           this._name = val
        }
    }
    const per = new Person("小李",20)
    per.age = 21
    console.log(per.name);
})();
